package com.ztman.router.common.base;

import android.app.Application;
import android.content.Context;

import com.alibaba.android.arouter.launcher.ARouter;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.BuildConfig;
import com.orhanobut.logger.DiskLogAdapter;
import com.orhanobut.logger.Logger;
import com.orhanobut.logger.PrettyFormatStrategy;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
import com.ztman.router.common.R;
import com.ztman.router.common.dagger.component.AppComponent;
import com.ztman.router.common.dagger.component.DaggerAppComponent;
import com.ztman.router.common.dagger.module.AppModule;
import com.ztman.router.common.dagger.module.HttpModule;
import com.ztman.router.common.utils.Utils;
import com.ztman.router.common.utils.logger.logger.TxtFormatStrategy;

import org.litepal.LitePal;

import me.yokeyword.fragmentation.Fragmentation;
import me.yokeyword.fragmentation.helper.ExceptionHandler;


public class MyApplication extends Application {

    private static MyApplication instance;
    public static final String TAG = "Application";
    private RefWatcher refWatcher;
    private static volatile AppComponent appComponent;

//    //static 代码段可以防止内存泄露, 全局设置刷新头部及尾部，优先级最低
//    static {
//        SmartRefreshLayout.setDefaultRefreshHeaderCreater((context, refreshLayout) -> {
//            //全局设置主题颜色
//            refreshLayout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);
//            //指定为Delivery Header，默认是贝塞尔雷达Header
//            return new DeliveryHeader(context);
//        });
//        SmartRefreshLayout.setDefaultRefreshFooterCreater((context, layout) -> {
//            //默认是 BallPulseFooter
//            return new BallPulseFooter(context).setAnimatingColor(ContextCompat.getColor(context, R.color.colorPrimary));
//        });
//    }
//
    public static synchronized MyApplication getInstance() {
        return instance;
    }

    /**
     * 功能：获取LeakCanary内存泄露检测的主动检测对象
     * @param context
     * @return refWatcher
     */
    //
    public static RefWatcher getRefWatcher(Context context) {
        MyApplication application = (MyApplication) context.getApplicationContext();
        return application.refWatcher;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;

        installLeakCanary();
        initLitePal();
        initLogger();
        initARouter();
        initFragmentation();

    }


    /**
     * 功能：添加内存泄漏的检测功能
     * @Link:https://github.com/square/leakcanary
     */
    private void installLeakCanary(){
        refWatcher = LeakCanary.install(this);
    }

    /**
     * 功能：初始化的对象关系数据库操作工具
     * @Link:https://github.com/LitePalFramework/LitePal
     *
     */
    private void initLitePal(){
        LitePal.initialize(this);
    }

    /**
     *
     *  功能：初始化日志功能
     * @Link:https://github.com/orhanobut/logger
     *
     */
    private void initLogger(){
        //DEBUG版本才打控制台log
        if (BuildConfig.DEBUG) {
            Logger.addLogAdapter(new AndroidLogAdapter(PrettyFormatStrategy.newBuilder().
                    tag(getString(R.string.app_name)).build()));
        }
        //把log存到本地
        Logger.addLogAdapter(new DiskLogAdapter(TxtFormatStrategy.newBuilder().
                tag(getString(R.string.app_name)).build(getPackageName(), getString(R.string.app_name))));
    }


    /**
     * 功能：初始化路由SDK
     *  @Link:https://github.com/alibaba/ARouter
     */
    private void initARouter(){
        Utils.init(this);
        if (Utils.isAppDebug()) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
//        if (true) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(instance); // 尽可能早，推荐在Application中初始化
    }

    /**
     *
     *  功能：初始化路由Fragmentation
     *  @Link:https://github.com/YoKeyword/Fragmentation
     */
    private void initFragmentation(){
        Fragmentation.builder()
                // 设置 栈视图 模式为 （默认）悬浮球模式
                // SHAKE: 摇一摇唤出
                // NONE：隐藏， 仅在Debug环境生效
                .stackViewMode(Fragmentation.NONE)
                .debug(true) // 实际场景建议.debug(BuildConfig.DEBUG)
                /**
                 * 可以获取到{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning}
                 * 在遇到After onSaveInstanceState时，不会抛出异常，会回调到下面的ExceptionHandler
                 */
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(Exception e) {
                        // 以Bugtags为例子: 把捕获到的 Exception 传到 Bugtags 后台。
                        // Bugtags.sendException(e);
                    }
                })
                .install();
    }


    public static synchronized AppComponent getAppComponent() {
        if (appComponent == null) {
            appComponent = DaggerAppComponent.builder()
                    .appModule(new AppModule(instance))
                    .httpModule(new HttpModule())
                    .build();
        }
        return appComponent;
    }


}
